package com.celan.task.standard;

/**
 * @param <T> 任务提交参数类型
 * @param <M> 任务结果类型
 * @author Celan
 * @description
 */
public abstract class AsyncTaskAbstractExecutor<T, M> {
    /**
     * 提交异步任务
     *
     * @param args 提交异步任务参数
     * @return 任务id
     */
    public abstract String submitAsyncTask(T args);

    /**
     * 查询异步任务详情
     *
     * @param taskId 任务id
     * @return 异步任务详情
     */
    public abstract AsyncTaskDetail<M> queryAsyncTask(String taskId);

    /**
     * 停止异步任务
     *
     * @param taskId 任务id
     * @return 是否停止成功
     */
    public abstract boolean stopAsyncTask(String taskId);

    /**
     * 处理超时任务
     */
    protected abstract void handleTimeoutTasks();

    /**
     * 更新进行中任务的结果
     */
    protected abstract void handleProcessingTasks();

    /**
     * 处理等待中的任务
     */
    protected abstract void handleWaitingTasks();

    /**
     * 任务重试
     */
    protected abstract void handleRetryTasks();

    /**
     * 异步任务定时处理器
     */
    public void scheduledExecutor() {
        handleTimeoutTasks();
        handleProcessingTasks();
        handleWaitingTasks();
        handleRetryTasks();
    }
}
